﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PIT.Labs.ProjectRepository.Owl2DotNet
{
    /// <summary>
    /// Represents an ontology and holds all entities in the ontology
    /// </summary>
    public interface IOntology : IEntity
    {
        /// <summary>
        /// Get the most genral class. All other classes are subclasses of Thing.
        /// </summary>
        IClass Thing
        {
            get;
        }

        /// <summary>
        /// Get all classes linearized
        /// </summary>
        IEnumerable<IClass> Classes
        {
            get;
        }

        /// <summary>
        /// Get a single class denoted by the given URI.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        IClass GetClass(Uri uri);

        /// <summary>
        /// Get all annotation properties linerized
        /// </summary>
        IEnumerable<IAnnotationProperty> AnnotationProperties
        {
            get;
        }

        /// <summary>
        /// Get a single annotation property by the given URI.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        IAnnotationProperty GetAnnotationProperty(Uri uri);

        /// <summary>
        /// List of data properties
        /// </summary>
        IEnumerable<IDataProperty> DataProperties
        {
            get;
        }

        /// <summary>
        /// Get a single data property by the given URI.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        IDataProperty GetDataProperty(Uri uri);

        /// <summary>
        /// List of data types
        /// </summary>
        IEnumerable<IDataType> DataTypes
        {
            get;
        }

        /// <summary>
        /// Get a single data type by the given URI.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        IDataType GetDataType(Uri uri);

        /// <summary>
        /// List of individuals
        /// </summary>
        IEnumerable<IIndividual> Individuals
        {
            get;
        }

        /// <summary>
        /// Get a single value property by the given URI.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        IIndividual GetIndividual(Uri uri);

        /// <summary>
        /// List of object properties
        /// </summary>
        IEnumerable<IObjectProperty> ObjectProperties
        {
            get;
        }

        /// <summary>
        /// Get a single object property by the given URI.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        IObjectProperty GetObjectProperty(Uri uri);
    }
}
